﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using CoreMobile.bce;
using CoreMobile.cfg;
using CoreMobile.cmd;
using CoreMobile.net;
using Opticon.Bcrctl;
using VABMobile.cfg;
using VABMobile.cmd;
using VABMobile.oo;
using VABMobile.print;

namespace VABMobile.ui
{
    public partial class PasajerosForm : Form, IBCENotifiable
    {
        private Turno turno;
        private BCEReader reader;
        private VABForm vabForm;
        private bool inVABFlag = false;
        //private int cachedSeatNumber = -1;
       

        public PasajerosForm(Turno _turno)
        {
            InitializeComponent();
            this.turno = _turno;
            this.reader = BCEReader.getReaderWith(this);
            initData();

            loadInForm();

            this.asientos.FullRowSelect = true;
           
        }

        private void loadInForm()
        {
            //MessageBox.Show("asientos " + turno.Bus.Asientos.Capacity);
            this.asientos.Items.RemoveAt(1);
            this.asientos.Items.RemoveAt(0);
            foreach (var _asiento in turno.Bus.Asientos)
            {
                Asiento asiento = (Asiento) _asiento;
                var li = new ListViewItem();
                li.Text = asiento.Numero + "";
                if (asiento.Boletos.Count == 0)
                {
                    li.SubItems.Add("-Sin Dato-");
                    li.SubItems.Add("--");
                }
                else
                {
                    li.SubItems.Add("[Reg. pasajero]");
                    li.SubItems.Add("AGC");
                }
                asientos.Items.Add(li);
            }
        }

        private void initData()
        {
            //var protocol = new VABProtocol();
            
            /*turno.Bus.Asientos= protocol.commandReceive(
                net.sendAndReceive(
                    protocol.commandSend(new TurnoIniCommand(), turno)));*/


            this.sendCmd(new TurnoIniCommand(), turno);

            List<Asiento> seats = new List<Asiento>(50);

            for (int i = 0; i < seats.Capacity; i++)
            {
                seats.Add(new Asiento(i+1));
            }
            turno.Bus.Asientos = seats;
            //setOrphanBoletos();

           
        }


        private void ventaMenu_Click(object sender, EventArgs e)
        {
            if (! this.checkSelectedSeatSize()) return;
            var cachedSeatNumber = asientos.SelectedIndices[0];

            this.vabForm = new VABForm(turno);
            vabForm.AsientoID.Text = "" + (cachedSeatNumber + 1);
            //inputForm.Text = "Config Ip";
            inVABFlag = true;
            if( DialogResult.OK == vabForm.ShowDialog())
            {
                ((Asiento) turno.Bus.Asientos[cachedSeatNumber])
                    .setBoletoEmitido(vabForm.Boleto);
                
                printBoleto(vabForm.Boleto);
                sendVAB(vabForm.Boleto);                
            }

            inVABFlag = false;
        }

        private void printBoleto(Boleto boleto)
        {
            var printer = new EPrinter();
            if (!printer.open())
            {
                MessageBox.Show("Error no se encuentra impresora, pasaje ya vendido");
                return;
            }

            while(! printer.print(boleto))
            {
                if(MessageBox.Show("Impresora >>"+printer.PrinterMsg
                     +" \nDesea imprimir de nuevo?","Falla Impresion"
                     ,MessageBoxButtons.YesNo
                     ,MessageBoxIcon.Exclamation
                     ,MessageBoxDefaultButton.Button1)==
                    System.Windows.Forms.DialogResult.No)
                        break;
            }

            printer.close();
        }

        private void sendVAB(Boleto boleto)
        {
            //var protocol = new VABProtocol();
           // Client net = Client.getDefaultClient();
           // net.connect();

            this.sendCmd(new VABCommand(),
                         boleto);
            


            //net.disconnect();

            asientos.Items[boleto.Asiento.Numero - 1].SubItems[1].Text 
                    = boleto.Pasajero.ppRut();
            asientos.Items[boleto.Asiento.Numero - 1].SubItems[2].Text
                = boleto.ppHora();
        }


        //exit
        private void exitMenu_Click(object sender, EventArgs e)
        {
            if (DialogResult.Yes == MessageBox.Show("A terminado el viaje?",
                "VAB",MessageBoxButtons.YesNo,
                MessageBoxIcon.Question,
                MessageBoxDefaultButton.Button1))
            {
                if (!sendEndOfService())
                {
                    if(MessageBox.Show("CMDs no enviados, desea forzar salida?"
                        ,"Mensajes en cola"
                        ,MessageBoxButtons.YesNo
                        ,MessageBoxIcon.Question
                        ,MessageBoxDefaultButton.Button1)== DialogResult.No)
                        return;
                }

                printVABs();
                Application.Exit();
            }
                    
        }

        private void printVABs()
        {
            var printer = new EPrinter();
            if (!printer.open())
            {
                MessageBox.Show("Error no se encuentra impresora, cerrando aplicacion.");
                return;
            }

            while (!printer.print(turno))
            {
                if (MessageBox.Show("Impresora >>" + printer.PrinterMsg
                     + " \nDesea imprimir de nuevo?", "Falla Impresion"
                     , MessageBoxButtons.YesNo
                     , MessageBoxIcon.Exclamation
                     , MessageBoxDefaultButton.Button1) ==
                    System.Windows.Forms.DialogResult.No)
                    break;
            }

            printer.close(); 
        }

        private bool sendEndOfService()
        {
            return this.sendCmd(new TurnoFinCommand(), turno);
        }

        public void receiverDataFromReader(object sender, BarcodeDecoder.ScanEventArgs e)
        {
         
            string data = reader.preProcess(e);

            if (string.IsNullOrEmpty(data)) return;

            if (e.CodeType != BarcodeDecoder.CodeIdTypes.PDF417)
            {
                //MessageBox.Show("Debe leer CI, para reg. pasajero");
                return;
            }

            var pasajero = new Persona(BCEReader.decodePDF417RegCivil(data)[0]); //rut

            if(inVABFlag)
            {
                vabForm.setPasajero(pasajero);
                return;
            }

            if(! this.checkSelectedSeatSize()) return;

            registrarPasajero(this.asientos.SelectedIndices[0], pasajero);

            //this.usuario.Text = auxiliar.ppRut();
        }

        private bool checkSelectedSeatSize()
        {
            if (this.asientos.SelectedIndices.Count != 1)
            {
                MessageBox.Show("Debe seleccionar UN asiento");
                return false;
            }

            return true;
        }

        private void registrarPasajero(int selectedSeat, Persona pasajero)
        {
            
            Asiento seat = (Asiento) turno.Bus.Asientos[selectedSeat];
            /*if(seat.BoletoEmitido == null)
            {
                MessageBox.Show("Boleto no vendio,use boton: Venta A Bordo");
                return;
            }*/
            seat.setBoletoEmitido(new Boleto());

            seat.UltBoletoEmitido.Pasajero = pasajero;
            seat.UltBoletoEmitido.Turno = this.turno;


            
            //Client net = Client.getDefaultClient();
            //net.connect();

            this.sendCmd(new RegistroCommand(), seat.UltBoletoEmitido);
            

            

           // net.disconnect();

            asientos.Items[selectedSeat].SubItems[1].Text = pasajero.ppRut();
        }

        private bool sendCmd(SendCommand cmd,IParameter parameter)
        {
            var protocol = new VABProtocol();

            Client.DEFAULT_IP = SettingsManager<VABSettings>.get().Settings.ServerIp;
            Client.DEFAULT_SEND_PORT = SettingsManager<VABSettings>.get().Settings.ServerPort;

            if (!Client.sendQuickly(protocol.commandSend(cmd, parameter)))
            {
                MessageBox.Show("No enviado: " + Client.status,"Comando encolado");
                return false;
            }
            
            return true;
        }
    }
}